<?php defined('SYSPATH') or die('No direct script access.');
/**
 * 支付方式抽象类
 *
 * @author  Yellow.Chow <aultoale@gmail.com>
 * @version $Id: adapter.php 82 2012-03-19 02:35:48Z yellow.chow $
 * @license http://www.gnu.org/licenses/gpl-3.0.html    GPL 3
 */
abstract class Payment_Adapter
{

    /**
     * 支付方式参数
     *
     * @var array
     */
    protected $_config = array();

    /**
     * 错误信息
     *
     * @var string
     */
    protected $_message = NULL;

    /**
     * 付款提交方法
     *
     * @var string
     */
    protected $_method = 'GET';

    /**
     * 构造方法
     *
     * @param array $config
     */
    public function __construct(array $config = array())
    {
        $this->set_config($config);
    }

    /**
     * 设置支付参数
     *
     * @param array $config
     * @return Payment_Adapter
     */
    public function set_config(array $config)
    {
        $this->_config = array_merge($this->_config, $config);

        return $this;
    }

    /**
     * 设置支付表单的提交方式
     *
     * @param  string  $method
     * @return Payment_Adapter
     */
    public function set_method($method)
    {
        $this->_method = strtolower($method) == 'post' ? 'POST' : 'GET';

        return $this;
    }

    /**
     * 获取支付表单的提交方式
     *
     * @return string
     */
    public function get_method()
    {
        return $this->_method;
    }

    /**
     * 设置订单编号
     *
     * @param  string  $id
     * @return Payment_Adapter
     */
    abstract public function set_id($id);

    /**
     * 设置订单主题
     *
     * @param  string  $subject
     * @return Payment_Adapter
     */
    abstract public function set_subject($subject);

    /**
     * 设置订单总金额
     *
     * @param  float  $amount
     * @return Payment_Adapter
     */
    abstract public function set_amount($amount);

    /**
     * 设置支付密钥
     *
     * @param  string  $key
     * @return Payment_Adapter
     */
    abstract public function set_key($key);

    /**
     * 获取支付网关地址
     *
     * @return string
     */
    abstract public function get_gateway();

    /**
     * 获取表单提交参数
     *
     * @return array
     */
    abstract public function get_params();

    /**
     * 获取支付 URL
     *
     * @return string
     */
    abstract public function get_payurl();

    /**
     * 对参数进行校验
     *
     * @return bool
     */
    abstract public function is_valid();

    /**
     * 获取支付名称
     *
     * @return string
     */
    abstract public function get_name();

    /**
     * 魔术方法，输出支付名称
     *
     * @return string
     */
    public function __toString()
    {
        return $this->get_name();
    }

    /**
     * 获取错误信息
     *
     * @return string
     */
    public function get_message()
    {
        return $this->_message;
    }

}